//我们提供一个类： 
//
// 
//class FooBar {
//  public void foo() {
//  for (int i = 0; i < n; i++) {
//   print("foo");
//   }
//  }
//
//  public void bar() {
//  for (int i = 0; i < n; i++) {
//   print("bar");
//  }
//  }
//}
// 
//
// 两个不同的线程将会共用一个 FooBar 实例。其中一个线程将会调用 foo() 方法，另一个线程将会调用 bar() 方法。 
//
// 请设计修改程序，以确保 "foobar" 被输出 n 次。 
//
// 
//
// 示例 1: 
//
// 
//输入: n = 1
//输出: "foobar"
//解释: 这里有两个线程被异步启动。其中一个调用 foo() 方法, 另一个调用 bar() 方法，"foobar" 将被输出一次。
// 
//
// 示例 2: 
//
// 
//输入: n = 2
//输出: "foobarfoobar"
//解释: "foobar" 将被输出两次。
// 
// 👍 100 👎 0

package leetcode.editor.cn;

import java.util.concurrent.ArrayBlockingQueue;

/**
 * Java：交替打印FooBar
 *
 * @author changgui
 */
@SuppressWarnings("all")
public class P1115_PrintFoobarAlternately {
    public static void main(String[] args) {

    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class FooBar {

        ArrayBlockingQueue<String> queue1;
        ArrayBlockingQueue<String> queue2;

        private int n;

        public FooBar(int n) {
            this.n = n;

            queue1 = new ArrayBlockingQueue<>(n);
            queue2 = new ArrayBlockingQueue<>(n);
            try {
                // 保证foo受限被执行
                queue1.put("s");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        public void foo(Runnable printFoo) throws InterruptedException {

            for (int i = 0; i < n; i++) {
                queue1.take();
                // printFoo.run() outputs "foo". Do not change or remove this line.
                printFoo.run();
                queue2.put("s");
            }
        }

        public void bar(Runnable printBar) throws InterruptedException {

            for (int i = 0; i < n; i++) {
                queue2.take();
                // printBar.run() outputs "bar". Do not change or remove this line.
                printBar.run();
                queue1.put("s");
            }
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

}